package com.bkgy.modularbx.coil_prod_stats.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.bkgy.modularbx.coil_prod_stats.domain.TCoilProductionStats;
import com.bkgy.modularbx.coil_prod_stats.dto.CoilStatsResultDTO;
import com.bkgy.modularbx.coil_prod_stats.dto.DefectReasonQueryDTO;
import com.bkgy.modularbx.coil_prod_stats.dto.DefectReasonResultDTO;
import com.bkgy.modularbx.coil_prod_stats.dto.MaterialWeightRangeResultDTO;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
* @author dell
* @description 针对表【T_COIL_PRODUCTION_STATS】的数据库操作Mapper
* @createDate 2025-06-10 10:06:27
* @Entity com.bkgy.modularbx.coil_prod_stats.domain.TCoilProductionStats
*/
@Mapper
public interface TCoilProductionStatsMapper extends BaseMapper<TCoilProductionStats> {

    /**
     * 按月统计（最近一个月）钢种、宽度、厚度维度的损失重量
     * @param lineCode 产线代码（可选）
     * @return 统计结果列表
     */
    List<CoilStatsResultDTO> statsLastMonth(@Param("lineCode") String lineCode);

    /**
     * 按日统计（昨天）钢种、宽度、厚度维度的损失重量
     * @param lineCode 产线代码（可选）
     * @return 统计结果列表
     */
    List<CoilStatsResultDTO> statsYesterday(@Param("lineCode") String lineCode);

    /**
     * 按时间范围统计钢种、宽度、厚度维度的损失重量
     * @param lineCode 产线代码（可选）
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 统计结果列表
     */
    List<CoilStatsResultDTO> statsByTimeRange(
        @Param("lineCode") String lineCode,
        @Param("startDate") String startDate,
        @Param("endDate") String endDate
    );

    /**
     * 按月统计（上个月整月）缺陷原因的损失重量
     * @param lineCode 产线代码（可选）
     * @param defectReason 缺陷原因（可选）
     * @param defectReasonCode 缺陷原因编码（可选）
     * @return 统计结果列表
     */
    List<DefectReasonResultDTO> statsDefectReasonLastMonth(
        @Param("lineCode") String lineCode,
        @Param("defectReason") String defectReason,
        @Param("defectReasonCode") String defectReasonCode
    );

    /**
     * 按日统计（昨天）缺陷原因的损失重量
     * @param lineCode 产线代码（可选）
     * @param defectReason 缺陷原因（可选）
     * @param defectReasonCode 缺陷原因编码（可选）
     * @return 统计结果列表
     */
    List<DefectReasonResultDTO> statsDefectReasonYesterday(
        @Param("lineCode") String lineCode,
        @Param("defectReason") String defectReason,
        @Param("defectReasonCode") String defectReasonCode
    );

    /**
     * 按时间范围统计缺陷原因的损失重量
     * @param lineCode 产线代码（可选）
     * @param defectReason 缺陷原因（可选）
     * @param defectReasonCode 缺陷原因编码（可选）
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 统计结果列表
     */
    List<DefectReasonResultDTO> statsDefectReasonByTimeRange(
        @Param("lineCode") String lineCode,
        @Param("defectReason") String defectReason,
        @Param("defectReasonCode") String defectReasonCode,
        @Param("startDate") String startDate,
        @Param("endDate") String endDate
    );

    List<DefectReasonResultDTO> statsDefectReason(DefectReasonQueryDTO queryDTO);

    /**
     * 按月统计（上个月整月）来料卷重范围
     * @param page 分页参数
     * @param lineCode 产线代码（可选）
     * @param steelGrade 钢种（可选）
     * @return 统计结果列表
     */
    IPage<MaterialWeightRangeResultDTO> statsMaterialWeightRangeLastMonth(
        IPage<MaterialWeightRangeResultDTO> page,
        @Param("lineCode") String lineCode,
        @Param("steelGrade") String steelGrade
    );

    /**
     * 按日统计（昨天）来料卷重范围
     * @param page 分页参数
     * @param lineCode 产线代码（可选）
     * @param steelGrade 钢种（可选）
     * @return 统计结果列表
     */
    IPage<MaterialWeightRangeResultDTO> statsMaterialWeightRangeYesterday(
        IPage<MaterialWeightRangeResultDTO> page,
        @Param("lineCode") String lineCode,
        @Param("steelGrade") String steelGrade
    );

    /**
     * 按时间范围统计来料卷重范围
     * @param page 分页参数
     * @param lineCode 产线代码（可选）
     * @param steelGrade 钢种（可选）
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 统计结果列表
     */
    IPage<MaterialWeightRangeResultDTO> statsMaterialWeightRangeByTimeRange(
        IPage<MaterialWeightRangeResultDTO> page,
        @Param("lineCode") String lineCode,
        @Param("steelGrade") String steelGrade,
        @Param("startDate") String startDate,
        @Param("endDate") String endDate
    );

    /**
     * 统计来料卷重范围（原有方法，保持兼容性）
     * @param steelGrade 钢种（可选）
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 统计结果列表
     */
    IPage<MaterialWeightRangeResultDTO> statsMaterialWeightRange(IPage<MaterialWeightRangeResultDTO> page,
                                                                @Param("steelGrade") String steelGrade,
                                                                @Param("startDate") String startDate,
                                                                @Param("endDate") String endDate
    );

    /**
     * 批量查询平均分卷数，按分组键聚合返回，使用@MapKey返回 Map<groupKey, rowMap>
     */
    List<Map<String,Object>> batchGetAvgCoilRecordsByGroups(
            @Param("groupKeys") List<MaterialWeightRangeResultDTO> groupKeys);
}




